// 文件工具类
const fs = require("fs");
const formidable = require("formidable");
const path = require('path');
// 递归创建目录 同步方法
let mkdirsSync = (dirname) => {
    if (fs.existsSync(dirname)) {
        return true;
    } else {
        if (mkdirsSync(path.dirname(dirname))) {
            fs.mkdirSync(dirname);
            return true;
        }
    }
}

module.exports = {
    /**
     * 上传文件
     * @param req
     * @param options 配置formidable和文件路径的相关参数
     *  eg:{
     *      fileDir:"public/file", 文件存放路径 相对于被引用的位置的相对位置，也可以使用绝对路径, 要求public目录要手动创建好
     *      maxFileSize :2 * 1024 * 1024， 文件最大的大小(指的是一次上传总的、多个的文件的大小) 单位B
     *  }
     */
    upload: (req, options) => {
        if (!options) {
            options = {};
        }
        // 文件存放目录  该目录是以被引用的位置作为相对位置。
        let cacheFolder = options.fileDir ? options.fileDir : 'public/file';
        mkdirsSync(cacheFolder);
        let form = new formidable.IncomingForm(); //创建上传表单
        form.encoding = 'utf-8'; //设置编辑
        form.uploadDir = cacheFolder; //设置上传目录
        form.keepExtensions = true; //保留后缀
        form.maxFileSize = options.maxFileSize ? options.maxFileSize : 2 * 1024 * 1024; //文件大小
        form.type = true;
        form.multiples =  true;
        return new Promise((resolve, reject) => {
            form.parse(req, async (err, fields, {files}) => {
                try{
                    files && files.size && (files = [files]);// 单个文件和多个文件上传的files不一样
                    if (err) {
                        // 这里头的逻辑是上传出错，比如总大小超过限制
                        throw err
                    } else {
                        let list = [];
                        for (let file in files) {
                            let tmp = files[file];
                            // 单个文件大小是否满足，应该要在这边进行判断
                            // xxxxxxx(逻辑不写了) 单个文件判断过程，如果有一个文件不满足，直接throw new Error('单个文件大小超过限制')
                            // if (tmp.size >= 100 * 1024) {
                            //     throw new Error('单个文件超过100KB')
                            // }
                            list.push({path: tmp.path, name: tmp.name, size: tmp.size});
                        }
                        console.log(`[FILEUTIL]文件上传成功${JSON.stringify(list)}`);
                        resolve({list, fields})
                    }
                } catch (e) {
                    console.log(`[FILEUTIL]文件上传异常：${e.message}`);
                    console.log(`[FILEUTIL]文件回退，计划回退文件数：${files?Object.keys(files).length:0}个`)
                    for (let file in files) {
                        let tmp = files[file];
                        fs.unlinkSync(tmp.path)
                    }
                    console.log(`[FILEUTIL]文件回退，成功回退：${files?Object.keys(files).length:0}个`)
                    reject('文件上传失败, 请检查文件大小')
                }
            })
        }).then(
            data => data
        ).catch(error => {
            throw new Error(error)
        })
    }
};